package com.nettylearning.base.netty.io.buffer;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.nio.Buffer;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

/**
 * @author vince
 * @date 2021/7/17 7:06
 * @description 2. Buffer的基本原理
 * @Version 1.0
 */
public class BufferDemo {
    public static void main(String[] args) throws Exception {
        // 文件I/O处理
        File file;
        FileInputStream fin = new FileInputStream("D://test.txt");
        // 创建文件的操作管道
        FileChannel fc = fin.getChannel();

        // 分配一个10个大小的缓冲区（即分配一个10个大小的Byte数组）
        ByteBuffer buffer = ByteBuffer.allocate(10);
        output("初始化", buffer);
        // read 读取
        fc.read(buffer);
        output("调用read()", buffer);

        // 准备操作之前，先flip锁定操作范围
        buffer.flip();
        output("调用flip()", buffer);

        // remaining判断有无可读数据
        while (buffer.remaining() > 0) {
            byte b = buffer.get();
            // System.out.println((char) b);
        }

        // clear 可以理解为解锁
        buffer.clear();
        output("调用clear()", buffer);
        // 最后关闭管道
        fin.close();
    }

    /**
     * 实时打印缓冲区状态
     *
     * @param step   操作节点
     * @param buffer 缓冲区
     */
    public static void output(String step, Buffer buffer) {
        System.out.println(step + " : ");
        // 容量，数组大小
        System.out.print("capacity：" + buffer.capacity() + ", ");
        // 当前操作数据所在的位置，也可以叫游标
        System.out.print("position：" + buffer.position() + ", ");
        // 锁定值，flip,数据操作范围索引只能在position - limit之间
        System.out.print("limit：" + buffer.limit());
        System.out.println();
    }
}
